import axios from 'axios'
import { getToken } from '../util/token'
import JSONBig from 'json-bigint'
import router from '../router'
import store from '../store/index'
import { Toast } from 'vant'

const request = axios.create({
  baseURL: process.env.VUE_APP_baseURL,
  transformResponse: [
    function (data) {
      // 优先使用JSONBig
      try {
        return JSONBig.parse(data)
      } catch (err) {
        return data
      }
    }
  ]
})

// 请求拦截器
request.interceptors.request.use(
  res => {
    if (res.needToken) {
      const token = getToken() ? JSON.parse(getToken()) : null
      if (token) {
        res.headers.authorization = `Bearer ${token.token}`
      }
    }

    return res
  },
  error => {
    return Promise.reject(error)
  }
)

// 响应拦截器
request.interceptors.response.use(
  res => {
    return res
  },
  async err => {
    console.log(err)
    if (err.response.status === 401) {
      const refreshToken = store.state.tokenInfo.refresh_token
      console.log(refreshToken)
      if (refreshToken) {
        try {
          // 发起刷新token请求，使用put请求
          const res = await axios({
            url: 'http://toutiao-app.itheima.net/v1_0/authorizations',
            method: 'put',
            headers: {
              Authorization: `Bearer ${refreshToken}`
            }
          })
          const newToken = res.data.data.token
          // 把新token保存到vuex
          store.commit('SetTokenInfo', {
            token: newToken, // 变化了
            refresh_token: refreshToken // 没有变化
            // request重发请求，它会自动去vuex中带上最新的token(没过期的，新的)
          })
          return request(err.config)
        } catch (err) {
          // 1清空token
          store.commit('SetTokenInfo', {})
          // 2回去登录
          router.push('/login')
          // 3返回错误信息
          return Promise.reject(new Error('请求新token失败'))
        }
      } else {
        // 1清空token
        store.commit('SetTokenInfo', {})
        // 2回去登录，带上要返回的地址
        Toast({
          message: '请登录'
        })
        router.push('/login')
        // 3返回错误信息
        return Promise.reject(new Error('refresh_token不存在'))
      }
    }
  }
)
export default request
